package main

import (
	"context"
	"flag"
	"gitee.com/jn-qq/go-tools/data"
	"log"
	"os"
	"os/signal"
	"runtime/debug"
	"sync"
	"syscall"
	"vector/control"
	"vector/tools"

	"gitee.com/jn-qq/multi_threader"
)

// 自定义运行参数
var threadNum = flag.Int("tn", 1, "开启线程数量，默认1")
var dfp = flag.String("dfp", "in.xlsx", "数据源，类型xlsx")
var sh = flag.String("sheet", "Sheet1", "工作簿名称")
var mode = flag.String("mode", "sseChat",
	"customerService(客服大模型)\n"+
		"tts(文字转语音)\n"+
		"sseChat(灵犀本地对话)\n"+
		"dispatch(灵犀线上对话)\n"+
		"vectorSearch(向量检索)\n"+
		"vectorLocal(向量分析本地)\n"+
		"vectorExternal(知识库对外向量)\n"+
		"vectorAccuracy(原子组准确率)\n"+
		"yyzd(一语直达)\n"+
		"faq(FAQ测评)\n"+
		"14B(智能体)\n"+
		"t5(意图识别)\n"+
		"ragLabel(检索标注)\n"+
		"rag(RAG分类)",
)
var intercept = flag.Int("inc", 0, "截取原子内容字节长度")
var simplePrint = flag.Bool("sp", true, "简易输出日志")
var sleep = flag.Duration("sleep", 0, "每条数据请求间隔时间，单位毫秒")

func init() {
	flag.Parse()

	tools.Config.SetArgs(*sleep, *dfp, *intercept, *simplePrint, *mode, *sh, *threadNum)

	// 初始化表格
	tools.EF = tools.NewExcelWriter()
}

func main() {
	// 创建一个通道用于接收中断信号
	sigChan := make(chan os.Signal, 1)
	// 注册要捕获的信号：中断信号（Ctrl+C）和终止信号
	signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)

	var wg sync.WaitGroup
	wg.Add(1)

	// 用于通知任务完成或异常的通道
	// true表示正常完成，false表示异常退出
	done := make(chan bool, 1)

	go func() {
		defer func() {
			if r := recover(); r != nil {
				// 捕获到panic，记录详细错误信息
				log.Printf("程序发生严重错误: %v\n堆栈信息:\n%s", r, debug.Stack())

				// 发送异常退出信号
				done <- false
			}

		}()
		defer wg.Done()

		// 执行主要任务
		multi_threader.NewPool(context.Background(), *threadNum, true).Run(&control.VectorFlow{})

		// 任务正常完成
		done <- true
	}()

	// 等待中断信号或任务完成
	select {
	case <-sigChan:
		// 收到中断信号
		log.Println("收到中断信号，正在保存已处理的数据...")
		if err := tools.EF.Save(); err != nil {
			log.Printf("文件保存失败: %v", err)
		}
		log.Println("数据已保存，程序退出。")
		os.Exit(1)
	case result := <-done:
		// 任务异常退出
		log.Printf("程序%s退出,保存数据", data.TernaryExpression(result, "正常", "异常"))
		_ = tools.EF.Save()
	}

	// 等待主程序退出
	wg.Wait()
}
